/**
 *  Copyright [2022] [https://www.xiaonuo.vip]
 *	Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *	1.请不要删除和修改根目录下的LICENSE文件。
 *	2.请不要删除和修改Snowy源码头部的版权声明。
 *	3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 *	4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 *	5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 *	6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
import { defineStore } from 'pinia'
import { changeColor } from '@/utils/themeUtil'
import config from '@/config'
import { message } from 'ant-design-vue'
import tool from '@/utils/tool'

const toolDataGet = (key) => {
	return tool.data.get(key)
}

// 获取缓存中的，如果取不到那就用配置的
const getCacheConfig = (value) => {
	const data = toolDataGet(value)
	if (data === null) {
		return config[value]
	}
	return data
}

/**
 * deprecated 请使用 useGlobalStore
 */
export const globalStore = defineStore({
	id: 'global',
	state: () => ({
		commonUrl: import.meta.env.VITE_PUBLIC_URL,
		erpUrl: import.meta.env.VITE_ERP_URL,

		// 移动端布局
		isMobile: false,
		// 布局
		layout: getCacheConfig('SNOWY_LAYOUT'),
		// 菜单是否折叠 toggle
		menuIsCollapse: getCacheConfig('SNOWY_MENU_COLLAPSE'),
		// 侧边菜单是否排他展开
		sideUniqueOpen: getCacheConfig('SNOWY_SIDE_UNIQUE_OPEN'),
		// 多标签栏
		layoutTagsOpen: getCacheConfig('SNOWY_LAYOUT_TAGS_OPEN'),
		// 是否展示面包屑
		breadcrumbOpen: getCacheConfig('SNOWY_BREADCRUMD_OPEN'),
		// 顶栏是否应用主题色
		topHeaderThemeColorOpen: getCacheConfig('SNOWY_TOP_HEADER_THEME_COLOR_OPEN'),
		// 顶栏主题色通栏
		topHeaderThemeColorSpread: getCacheConfig('SNOWY_TOP_HEADER_THEME_COLOR_SPREAD'),
		// 模块坞
		moduleUnfoldOpen: getCacheConfig('SNOWY_MODULE_UNFOLD_OPEN'),
		// 主题
		theme: getCacheConfig('SNOWY_THEME'),
		// 主题颜色
		themeColor: toolDataGet('SNOWY_THEME_COLOR') || config.COLOR,
		// 整体表单风格
		formStyle: getCacheConfig('SNOWY_FORM_STYLE'),
		// 用户信息
		userInfo: toolDataGet('USER_INFO') || {},
		// 系统配置
		sysBaseConfig: toolDataGet('SNOWY_SYS_BASE_CONFIG') || config.SYS_BASE_CONFIG,
		// 默认应用
		module: getCacheConfig('SNOWY_MENU_MODULE_ID'),

		phoneStatus: false, // 线路外呼的通话状态 true-通话中 false-空闲中
		phoneMethod: toolDataGet('PHONE_METHOD') || '2', // 通讯方式 1-线路 2-4g外呼
		phoneData: toolDataGet('PHONE_DATA') || null, // 通话信息记录
		dashboardNode: null, // 拨号盘组件节点
		transferStatus: false, // 点击转客户动作 false-否 true-是
		transferCode: null, // 转客户编码
		transferType: null, // 转客户类型
		transferPersonData: [], // 转客户人员列表
		transferList: [], // // 转客户人员id列表
		allDeptList: toolDataGet('ALL_DEPT_LIST') || [],

		tagNode: null, // 打标签组件节点
		tagFinishStatus: false, // 打标签完成状态 false-否 true-是
		tagSimple: false, // 打标签弹窗简版
		tagShowTab: true, // 打标签弹窗线索tabs
		tagIdList: [], // 标签ids
		tagNameList: [], // 标签names

		autoDialStatus: false // 自动拨号
	}),
	getters: {
		erpPayStatus(state) {
			const { product, erpUser, erpstatus: erpStatus } = state.userInfo
			return ['1', '3'].includes(product) && erpUser === '1' && erpStatus === '1'
		},
		companyStatus(state) {
			const { publicRoleId, builtIn } = state.userInfo
			return builtIn === '1' || publicRoleId
		},
		roleAuthMap(state) {
			// dataLevel  1-本人数据，2-本部门数据，3-本部门及下属部门数据，4-全部数据，5-自定义
			const { dataLevel, departmentId, departmentIds } = state.userInfo
			const authMap = {
				self: false,
				dept: false,
				deptAndSub: false,
				all: false,
				deptId: departmentId,
				deptIds: departmentIds ? departmentIds.split(',').map((item) => parseInt(item)) : []
			}
			if (dataLevel === '1') {
				// 本人数据
				authMap.self = true
			} else if (dataLevel === '2') {
				// 本部门数据
				authMap.self = true
				authMap.dept = true // 自定义 - 本部门人员
			} else if (dataLevel === '3') {
				// 本部门及下属部门数据
				authMap.self = true
				authMap.dept = true
				authMap.deptAndSub = true // 自定义 - 本部门及下属部门人员
			} else if (dataLevel === '4') {
				// 全部数据
				authMap.self = true
				authMap.dept = true
				authMap.deptAndSub = true
				authMap.all = true // 自定义 - 全部部门人员
			}
			return authMap
		},
		/**
		 * 根据角色权限筛选
		 * @param state
		 * @returns {*[]}
		 */
		authDeptList(state) {
			const { dept, deptAndSub, all, deptId, deptIds } = this.roleAuthMap
			let deptList = []
			if (dept) {
				deptList = JSON.parse(JSON.stringify(state.allDeptList))
				if (all) {
					// deptList = state.allDeptList
				} else if (deptAndSub) {
					// deptList = getTargetDept(state.allDeptList, deptId)
					getTargetDeptList(deptList, deptIds)
				} else if (dept) {
					// deptList = getTargetDept(state.allDeptList, deptId, false)
					getTargetDeptList(deptList, deptIds, false)
				} else {
					deptList = []
				}
			}
			return deptList
		},
		/**
		 * 只有员工单选
		 * @param state
		 * @returns {any}
		 */
		selectableDeptList(state) {
			const list = JSON.parse(JSON.stringify(state.allDeptList))
			formatDeptSelectable(list)
			return list
		},
		/**
		 * 筛除指定复选框禁选
		 * @param state
		 * @returns {function(*=): any}
		 */
		disableDeptList(state) {
			return (disableIds) => {
				const list = JSON.parse(JSON.stringify(state.allDeptList))
				formatDeptDisable(list, disableIds)
				return list
			}
		},
		/**
		 * 是否线路外呼
		 */
		isLineCall(state) {
			return state.phoneMethod === '1'
		},
		/**
		 * 是否4G外呼
		 */
		is4GCall(state) {
			return state.phoneMethod === '2'
		}
	},
	actions: {
		setIsMobile(key) {
			this.isMobile = key
		},
		setLayout(key) {
			this.layout = key
		},
		setTheme(key) {
			this.theme = key
			const closeMessage = message.loading(`加载中...`)
			changeColor(this.themeColor, key).then(closeMessage)
		},
		setThemeColor(key) {
			this.themeColor = key
			const closeMessage = message.loading(`加载中...`)
			changeColor(key, this.theme).then(closeMessage)
		},
		initTheme() {
			const closeMessage = message.loading(`加载中...`)
			changeColor(this.themeColor, this.theme).then(closeMessage)
		},
		toggleConfig(key) {
			this[key] = !this[key]
		},
		setFormStyle(key) {
			this.formStyle = key
		},
		setUserInfo(key) {
			this.userInfo = key
		},
		setSysBaseConfig(key) {
			this.sysBaseConfig = key
		},
		setModule(key) {
			this.module = key
		},
		setPhoneStatus(key) {
			this.phoneStatus = key
		},
		setPhoneMethod(key) {
			this.phoneMethod = key
			tool.data.set('PHONE_METHOD', key)
		},
		setPhoneData(key) {
			this.phoneData = key
			tool.data.set('PHONE_DATA', key)
		},
		setDashboardNode(key) {
			this.dashboardNode = key
		},
		setTransferStatus(key) {
			this.transferStatus = key
		},
		setTransferPersonDataAndList(personData, list) {
			this.transferPersonData = personData
			this.transferList = list
		},
		setAllDeptList(allDeptList) {
			this.allDeptList = allDeptList
		}
	}
})

// const getTargetDept = (list, deptId, subStatus = true) => {
// 	for (let i = 0; i < list.length; i++) {
// 		const item = list[i]
// 		if (item.id === deptId) {
// 			if (!subStatus) {
// 				item.children = item.children.filter((item) => item.id.startsWith('e_'))
// 			}
// 			return [item]
// 		} else {
// 			if (item.children && item.children.length) {
// 				const targetList = getTargetDept(item.children, deptId, subStatus)
// 				if (targetList) {
// 					return targetList
// 				}
// 			}
// 		}
// 	}
// }
const getTargetDeptList = (list, deptIds, subStatus = true) => {
	for (let i = 0; i < list.length; i++) {
		const item = list[i]
		item.disabled = true
		const selfTargetStatus = deptIds.includes(parseInt(item.id.startsWith('e_') ? item.parentId : item.id))
		const subTargetStatus = subStatus && tool.hasIntersection(item.parentIds, deptIds)
		item.disabled = !(selfTargetStatus || subTargetStatus)

		if (item.children && item.children.length) {
			getTargetDeptList(item.children, deptIds, subStatus)
		}
	}
}

const formatDeptSelectable = (list) => {
	for (let i = list.length - 1; i >= 0; i--) {
		const item = list[i]
		if (item.id.charAt(2) === '_') {
			list.splice(i, 1)
			continue
		}

		if (!item.id.startsWith('e')) {
			item.selectable = false

			if (item.children && item.children.length) {
				formatDeptSelectable(item.children)
			}
		}
	}
}

const formatDeptDisable = (list, disableIds) => {
	for (let i = list.length - 1; i >= 0; i--) {
		const item = list[i]
		if (item.id.charAt(2) === '_') {
			list.splice(i, 1)
			continue
		}

		if (disableIds && disableIds.length && disableIds.includes(item.id)) {
			item.disabled = true
		}

		if (item.children && item.children.length) {
			formatDeptDisable(item.children, disableIds)
		}
	}
}

export const useGlobalStore = globalStore
